import {WPS_Enum,constWpsEnum,Enum996CodeOfficeFlag,EnumDocSaveFlag,EnumDocLandMode} from "./enum.js"

import {
  setPluginStorageItem,
  getPluginStorageItem,
  UploadFile,
  getOriginURL,
  GetDocParamsValue,
  pRemoveDocParam,
  getDocSavePath,
  pGetValidDocTempPath,
} from "../common/common";

import {

  pCheckIs996CodeOffice,
  pISOADocReadOnly, pIsOnlineOADoc, savePdfoServer, saveWpsToServer,

} from "./wpsCommon.js"

import { CACHE_KEY, useCache ,getNicknameWithUsername} from '@/hooks/web/useCache'
import { OnWindowActivate,OnDocumentBeforeSave,
    OnDocumentBeforeClose,OnDocumentAfterClose,
    OnDocumentBeforePrint,OnDocumentOpen,OnDocumentNew
} from './wpsEventFunction'


//初始化全局参数
export function pInitParameters() {
    //在OA助手加载前，先保存用户原有的WPS应用用户名称
    let l_wpsUserName = wps.WpsApplication().UserName;
    setPluginStorageItem(constWpsEnum.WPSInitUserName, l_wpsUserName);

    //设置新打开文档是否默认显示加载项  默认为false
    setPluginStorageItem(constWpsEnum.Show996CodeTabDocActive, false);

    //弹出上传成功后的提示信息
    // wps.PluginStorage.setItem(constStrEnum.Save2OAShowConfirm, true);

    //按钮的标记控制
    // wps.PluginStorage.setItem(constStrEnum.RevisionEnableFlag, false)

    // 初始化默认禁止保存
    setPluginStorageItem(constWpsEnum.OADocUserSave, EnumDocSaveFlag.NoneOADocSave);

    //设置是否允许来自OA的文件再次被打开
    setPluginStorageItem(constWpsEnum.AllowOADocReOpen, false);

}

//挂载WPS的文档事件
export function AddDocumentEvent() {
    wps.ApiEvent.AddApiEventListener("WindowActivate", OnWindowActivate);
    wps.ApiEvent.AddApiEventListener("DocumentBeforeSave", OnDocumentBeforeSave);
    wps.ApiEvent.AddApiEventListener("DocumentBeforeClose", OnDocumentBeforeClose);
    wps.ApiEvent.AddApiEventListener("DocumentAfterClose", OnDocumentAfterClose);
    wps.ApiEvent.AddApiEventListener("DocumentBeforePrint", OnDocumentBeforePrint);
    wps.ApiEvent.AddApiEventListener("DocumentOpen", OnDocumentOpen);
    wps.ApiEvent.AddApiEventListener("DocumentNew", OnDocumentNew);
}




export function pGet996CodeDocLabel() {
  var l_Doc = wps.WpsApplication().ActiveDocument;
  if (!l_Doc) {
    return "";
  }

  var l_strLabel = ""; //初始化

  if (pIsOnlineOADoc(l_Doc) == true) { // 判断是否为不落地文档
    l_strLabel = "不落地";
  } else {
    l_strLabel = l_Doc.Path != "" ? "落地" : "未保存";
  }

  //判断OA文档是否是受保护
  if (pISOADocReadOnly(l_Doc) == true) {
    l_strLabel = l_strLabel + "(保护)";
  }
  return l_strLabel;
}
export function pSetUserNameLabelControl() {

  return getNicknameWithUsername();
}





/**
 * 获取对象中指定属性的值
 * @param {*} params
 * @param {*} Key
 */
export function GetParamsValue(Params, Key) {
    if (typeof(Params) == "undefined") {
        return "";
    }

  let l_rtnValue = Params[Key];
    return l_rtnValue;
}


export async function saveToServer() {
  let l_doc = wps.WpsApplication().ActiveDocument;
  if (!l_doc) {
    alert("空文档不能保存！");
    return;
  }

  //非OA文档，不能上传到OA
  if (pCheckIs996CodeOffice() == false) {
    alert("非系统打开的文档，不能直接上传到系统！");
    return;
  }


  //如果是OA打开的文档，并且设置了保护的文档，则不能再上传到OA服务器
  if (pISOADocReadOnly(l_doc)) {
    alert("系统设置了保护的文档，不能再提交到系统后台。");
    return;
  }


  //如果是OA打开的文档，禁止修改
  if (pIsOnlineOADoc(l_doc) == true) {
    alert("在线文档，禁止修改！");
    return;
  }

  /**
   * 参数定义：OAAsist.UploadFile(name, path, url, field,  "OnSuccess", "OnFail")
   * 上传一个文件到远程服务器。
   * name：为上传后的文件名称；
   * path：是文件绝对路径；
   * url：为上传地址；
   * field：为请求中name的值；
   * 最后两个参数为回调函数名称；
   */

  // var l_showConfirm = wps.PluginStorage.getItem(constStrEnum.Save2OAShowConfirm)
  let l_showConfirm = GetDocParamsValue(l_doc,constWpsEnum.Save2OAShowConfirm);
  if (l_showConfirm) {
    if (!wps.confirm("先保存文档，并开始上传到系统后台，请确认？")) {
      return;
    }
  }

  let conformStr = null ;
  if(l_showConfirm){
    conformStr = "文件上传成功！继续编辑请确认，取消关闭文档。" ;
  }
  var saveWpsToServerRes = await saveWpsToServer(l_doc,conformStr);
  if(saveWpsToServerRes.code !== 0){
    alert(saveWpsToServerRes.msg)
    return;
  }

  if (!! conformStr) {
    if (wps.confirm(conformStr) == false) {
      if (l_doc) {
        l_doc.Close(-1); //保存文档后关闭
      }
    }
  }

  //判断是否同时上传PDF等格式到OA后台
  var l_uploadWithAppendPath = GetDocParamsValue(l_doc, constWpsEnum.uploadWithAppendPath); //标识是否同时上传OFD、PDF等格式的文件
  if (l_uploadWithAppendPath == "1") {
    // todo yinjt  调用转 pdf格式函数，强制关闭转换修订痕迹，不弹出用户确认的对话框
    // pDoChangeToOtherDocFormat(l_doc, ".pdf", false, false); //
  }
  return;

}


/**
 *  执行另存为本地文件操作
 */
export function OnBtnSaveAsLocalFile() {

  //初始化临时状态值
  setPluginStorageItem(constWpsEnum.OADocUserSave, false);

  //检测是否有文档正在处理
  let l_doc = wps.WpsApplication().ActiveDocument;
  if (!l_doc) {
    alert("WPS当前没有可操作文档！");
    return;
  }

  // 设置WPS文档对话框 2 FileDialogType:=msoFileDialogSaveAs
  let l_ksoFileDialog = wps.WpsApplication().FileDialog(2);
  l_ksoFileDialog.InitialFileName = l_doc.Name; //文档名称

  if (l_ksoFileDialog.Show() == -1) { // -1 代表确认按钮
    setPluginStorageItem(constWpsEnum.OADocUserSave, true); //设置保存为临时状态，在Save事件中避免OA禁止另存为对话框
    l_ksoFileDialog.Execute(); //会触发保存文档的监听函数

    pRemoveDocParam(l_doc)

    wps.ribbonUI.Invalidate(); //刷新Ribbon的状态

  };
}


/**
 * 作用： 把当前文档保存为其他格式的文档并上传
 * @param {*} p_FileSuffix 输出的目标格式后缀名，支持：.pdf .uof .uot .ofd
 * @param {*} pShowPrompt 是否弹出用户确认框
 */
export function OnDoChangeToOtherDocFormat(p_FileSuffix, pShowPrompt) {
  let l_suffix = p_FileSuffix; // params.suffix;
  if (!l_suffix) {
    return;
  }
  //获取当前执行格式转换操作的文档
  let l_doc = wps.WpsApplication().ActiveDocument;
  if (!l_doc) {
    return;
  }
  if (typeof(pShowPrompt) == "undefined") {
    pShowPrompt = true; //默认设置为弹出用户确认框
  }
  //默认设置为以当前文件的显示模式输出，即当前为修订则输出带有修订痕迹的
  pDoChangeToOtherDocFormat(l_doc, l_suffix, pShowPrompt);
}

/**
 * @param {string} type
 */
export function importLocalFile(type){
  let l_FileName = "";
  let wpsApp = wps.WpsApplication();
  //msoFileDialogFilePicker = 3
  let l_FileDialog = wps.WpsApplication().FileDialog(3);
  if (l_FileDialog.Show()) {
    l_FileName = l_FileDialog.SelectedItems;
    if (l_FileName.Count > 0) {

      let selection = wpsApp.ActiveWindow.Selection;

      if("Insert" == type){

      }else if("Append" == type){
        selection.EndKey(6, 0)
      }else if("Replace" == type){
        selection.WholeStory(); //选取全文
        selection.Delete();     // 删除选中内容
      }


      wpsApp.Selection.InsertFile(l_FileName.Item(1));

    }
  }
}

/**
 * 作用：执行清稿按钮操作
 * 业务功能：清除所有修订痕迹和批注
 */
export function OnBtnClearRevDoc() {
  let doc = wps.WpsApplication().ActiveDocument;
  if (!doc) {
    alert("尚未打开文档，请先打开文档再进行清稿操作！");
  }

  //执行清稿操作前，给用户提示
  if (!wps.confirm("清稿操作将接受所有的修订内容，关闭修订显示。请确认执行清稿操作？")) {
    return;
  }

  //接受所有修订
  if (doc.Revisions.Count >= 1) {
    doc.AcceptAllRevisions();
  }
  //去除所有批注
  if (doc.Comments.Count >= 1) {
    doc.RemoveDocumentInformation(wps.Enum&&wps.Enum.wdRDIComments||1);
  }

  //删除所有ink墨迹对象
  pDeleteAllInkObj(doc);

  doc.TrackRevisions = false; //关闭修订模式
  wps.ribbonUI.InvalidateControl("btnOpenRevision");

  return;
}


/**
 * 作用：删除当前文档的所有墨迹对象
 * @param {*} p_Doc
 */
function pDeleteAllInkObj(p_Doc) {
  let l_Count = 0;
  let l_IsInkObjExist = true;
  while (l_IsInkObjExist == true && l_Count < 20) {
    l_IsInkObjExist = pDeleteInkObj(p_Doc);
    l_Count++;
  }
  return;
}

/**
 * 删除墨迹对象
 */
function pDeleteInkObj(p_Doc) {
  let l_IsInkObjExist = false;
  if (p_Doc) {
    for (let l_Index = 1; l_Index <= p_Doc.Shapes.Count; l_Index++) {
      let l_Item = p_Doc.Shapes.Item(l_Index);
      if (l_Item.Type == 23) {
        l_Item.Delete();
        //只要有一次找到Ink类型，就标识一下
        if (l_IsInkObjExist == false) {
          l_IsInkObjExist = true;
        }
      }
    }
  }
  return l_IsInkObjExist;
}


/**
 *  作用：把当前文档修订模式打开
 */
export function OnOpenRevisions() {
  //获取当前文档对象
  let l_Doc = wps.WpsApplication().ActiveDocument;
  OnRevisionsSwitch(l_Doc, true);
}


/**
 *  作用：把当前文档修订模式关闭
 */
export function OnCloseRevisions() {
  //获取当前文档对象
  let l_Doc = wps.WpsApplication().ActiveDocument;
  OnRevisionsSwitch(l_Doc, false);
}


function OnRevisionsSwitch(doc, openRevisions) {
  if (!doc) {
    return;
  }
  let l_activeWindow = doc.ActiveWindow;
  if (l_activeWindow) {
    let v = l_activeWindow.View;
    if (v) {
      //WPS 显示使用“修订”功能对文档所作的修订和批注
      v.ShowRevisionsAndComments = openRevisions;
      //WPS 显示从文本到修订和批注气球之间的连接线
      v.RevisionsBalloonShowConnectingLines = openRevisions;
    }
    if (openRevisions == true) {
      //去掉修改痕迹信息框中的接受修订和拒绝修订勾叉，使其不可用
      wps.WpsApplication().CommandBars.ExecuteMso("KsoEx_RevisionCommentModify_Disable");
    }

    //RevisionsMode:
    //wdBalloonRevisions	0	在左边距或右边距的气球中显示修订。
    //wdInLineRevisions	1	在正文中显示修订，使用删除线表示删除，使用下划线表示插入。
    //                      这是 Word 早期版本的默认设置。
    //wdMixedRevisions	2	不支持。
    doc.TrackRevisions = openRevisions; // 开关修订
    l_activeWindow.ActivePane.View.RevisionsMode = 2; //2为不支持气球显示。

  }
}


/**
 * 作用：接受所有修订内容
 *
 */
export function OnAcceptAllRevisions() {
  //获取当前文档对象
  let l_Doc = wps.WpsApplication().ActiveDocument;
  if (!l_Doc) {
    return;
  }
  if (l_Doc.Revisions.Count >= 1) {
    if (!wps.confirm("目前有" + l_Doc.Revisions.Count + "个修订信息，是否全部接受？")) {
      return;
    }
    l_Doc.AcceptAllRevisions();
  }
}




/**
 * 作用：拒绝当前文档的所有修订内容
 */
export function OnRejectAllRevisions() {
  let l_Doc = wps.WpsApplication().ActiveDocument;
  if (!l_Doc) {
    return;
  }
  if (l_Doc.Revisions.Count >= 1) {
    l_Doc.RejectAllRevisions();
  }
}
/**
 * 作用：拒绝当前文档的所有修订内容
 */
export function createTaskPane(urlPath) {
  let tsId = getPluginStorageItem('taskpane_id')
  let tskpane = null;
  if(tsId != undefined){
    tskpane = window.Application.GetTaskPane(tsId)
    tskpane.Navigate(getOriginURL(urlPath))
  }
  else {
    tskpane = window.Application.CreateTaskPane(getOriginURL(urlPath))
    let id = tskpane.ID
    setPluginStorageItem('taskpane_id', id)
  }

  tskpane.DockPosition = WPS_Enum.msoCTPDockPositionRight  //这里可以设置taskapne是在左边还是右边
  tskpane.Width = 300
  tskpane.Visible = true

}



/**
 * wps内弹出web页面
 * @param {*} html 文件名
 * @param {*} title 窗口标题
 * @param {*} hight 窗口高
 * @param {*} width 窗口宽
 */
export function OnShowDialog(html, title, height, width, bModal) {
  var l_ActiveDoc = wps.WpsApplication().ActiveDocument;
  if (!l_ActiveDoc) {
    alert("WPS当前没有可操作文档！")
    return;
  }
  if (typeof bModal == "undefined" || bModal == null) {
    bModal = true;
  }
  width *= window.devicePixelRatio;
  height *= window.devicePixelRatio;
  var url = getOriginURL(html);
  wps.ShowDialog(url, title, height, width, bModal);
}



/**
 *  作用：在文档的当前光标处插入从前端传递来的图片
 *  OA参数中 picPath 是需要插入的图片路径
 *  图片插入的默认版式是在浮于文档上方
 */
export function DoInsertPicToDoc() {
  console.log("DoInsertPicToDoc...");

  let l_doc; //文档对象
  l_doc = wps.WpsApplication().ActiveDocument;
  if (!l_doc) {
    return;
  }

  //获取当前文档对象对应的OA参数
  let l_picPath = GetDocParamsValue(l_doc, constWpsEnum.picPath); // 获取OA参数传入的图片路径
  if (l_picPath == null) {
    // alert("未获取到系统传入的图片URL路径，不能正常插入图片");
    // return;
    //如果没有传，则默认写一个图片地址
    l_picPath="https://code.996code.top:88/yudao-server/admin-api/infra/file/4/get/328e42146073d6e4a1d093380dc8b0d50d1695c75f96610a279acb8a7b525980.png"
  }

  let l_picHeight =  39.117798; //13.8mm=39.117798磅
  let l_picWidth = 72; //49.7mm=140.880768磅

  let l_shape = l_doc.Shapes.AddPicture(l_picPath, false, true,0,0, l_picWidth, l_picHeight);
  l_shape.Select();
  // l_shape.WrapFormat.Type = wps.Enum&&wps.Enum.wdWrapBehind||5; //图片的默认版式为浮于文字上方，可通过此设置图片环绕模式
}



/**
 *   插入水印
 */
export function DoInsertWaterToDoc(){
  let app=wps.WpsApplication();
  let doc = app.ActiveDocument;
  let selection = doc.ActiveWindow.Selection;
  let pageCount = app.ActiveWindow.ActivePane.Pages.Count;
  for(var i=1;i<=pageCount;i++){
    selection.GoTo(1, 1, i);
    app.ActiveWindow.ActivePane.View.SeekView=9;
    app.ActiveDocument.Sections.Item(1).Headers.Item(1).Shapes.AddTextEffect(0, "公司绝密", "华文新魏", 36, false, false, 0, 0).Select();
    let shapeRange = app.Selection.ShapeRange;
    shapeRange.TextEffect.NormalizedHeight = false;
    shapeRange.Line.Visible = false;
    shapeRange.Fill.Visible = true;
    shapeRange.Fill.Solid();
    shapeRange.Fill.ForeColor.RGB = 12632256;       /* WdColor枚举 wdColorGray25 代表颜色值 */
    shapeRange.Fill.Transparency = 0.5;             /* 填充透明度，值为0.0~1.0 */
    shapeRange.LockAspectRatio = true;
    shapeRange.Height = 4.58 * 28.346;
    shapeRange.Width = 28.07 * 28.346;
    shapeRange.Rotation = 315;                      /* 图形按照Z轴旋转度数，正值为顺时针旋转，负值为逆时针旋转 */
    shapeRange.WrapFormat.AllowOverlap = true;
    shapeRange.WrapFormat.Side = 3;                 /* WdWrapSideType枚举 wdWrapLargest 形状距离页边距最远的一侧 */
    shapeRange.WrapFormat.Type = 3;
    shapeRange.RelativeHorizontalPosition = 0;
    shapeRange.RelativeVerticalPosition = 0;
    shapeRange.Left = -999995;
    shapeRange.Top = -999995;
  }                  /* WdShapePosition枚举 wdShapeCenter 形状的位置在中央 */
  selection.GoTo(1, 1, 1);
  app.ActiveWindow.ActivePane.View.SeekView=0;
}


/**
 * 插入时间
 * params参数结构
 * params:{
 *
 * }
 */
export function OnInsertDateClicked() {
  let l_Doc = wps.WpsApplication().ActiveDocument;
  if (l_Doc) {
    //打开插入日期对话框
    wps.WpsApplication().Dialogs.Item(wps.Enum&&wps.Enum.wdDialogInsertDateTime||165).Show();
  }
}



/**
 * 作用：打开当前文档的页面设置对话框
 */
export function OnPageSetupClicked() {
  let wpsApp = wps.WpsApplication();
  let doc = wpsApp.ActiveDocument;
  if (!doc) {
    return;
  }
  wpsApp.Dialogs.Item(wps.Enum&&wps.Enum.wdDialogFilePageSetup||178).Show();
}

/**
 * 作用：打开当前文档的打印设置对话框
 */
export function OnPrintDocBtnClicked() {
  let wpsApp = wps.WpsApplication();
  let doc = wpsApp.ActiveDocument;
  if (!doc) {
    return;
  }
  wpsApp.Dialogs.Item(wps.Enum&&wps.Enum.wdDialogFilePrint||88).Show();
}

/**
 * 作用：把当前文档输出为另外的格式保存
 * @param {*} p_Doc 文档对象
 * @param {*} p_Suffix 另存为的目标文件格式
 * @param {*} pShowPrompt 是否弹出用户确认框
 */
async function pDoChangeToOtherDocFormat(p_Doc, p_Suffix, pShowPrompt) {
  if (!p_Doc) {
    return;
  }

  let l_suffix = p_Suffix;

  if (pShowPrompt == true) {
    if (!wps.confirm("当前文档将另存一份" + l_suffix + " 格式的副本，并上传到系统后台，请确认 ？")) {
      return;
    }
  }
  let savePdfoServerRes = await savePdfoServer(p_Doc);
  if (savePdfoServerRes.code !== 0) {
    alert(savePdfoServerRes.msg)
  }else {
    alert("文件转格式保存成功！");
  }
}




/**
 * 作用：
 * @param {*} doc
 *
 * 返回值：是否执行了上传操作，布尔值
 */
function handleFileAndUpload(doc) {


}
